// NodeThree
// 包含头文件，初始化系统及相关模块
#include "ls1x.h"
#include "Config.h"
#include "ls1x_gpio.h"
#include "ls1x_latimer.h"
#include "ls1c102_interrupt.h"
#include "iic.h"
#include "oled.h"
#include "dht11.h"
#include "BEEP.h"
#include "key.h"
#include "led.h"
#include "ls1c102_adc.h"
#include "fhum.h"
#include "ZigBee.h"
#include "queue.h"
#define LED 20
#define DATA_PACKET_LENGTH 8    // 温湿度数据包长度
#define ALARM_PACKET_LENGTH 6   // 火灾雨水报警数据包长度

char str[50];
static uint16_t temperature;
static uint16_t humidity;
static uint16_t fhumidity;
unsigned short value;
uint8_t received_data = 0;
int time = 0;
int Fflag=0;
int FIRE, rain,smoke,Fflag;
uint8_t data[10]; // 数据包
int main(int arg, char *args[])
{
    SystemClockInit(); // 时钟等系统配置
    GPIOInit();        // io配置
    OLED_Init();
    EnableInt(); // 开总中断
    Smoke_Init();
    BEEP_Init();
    Uart0_init(9600); // 串口0初始化，波特率9600
    AFIO_RemapConfig(AFIOB, GPIO_Pin_16, 0); // 初始化ADC通道6引脚（雨水传感器）
    Adc_powerOn();                           // 打开ADC电源
    Adc_open(ADC_CHANNEL_I6);                // 开启ADC通道6
    OLED_Show_Str(10, 0, "system", 16);   // OLED显示界面
    Uart1_init(9600);
    DL_LN3X_Init(DL_LN3X_NODE, CHANNEL, Network1_Id); // 设置为主机（接收端），设置信道为0x12，网络地址为0x0003
    Queue_Init(&Circular_queue);
    // 检测温湿度传感器
    while (DHT11_Init()) {
        OLED_Show_Str(10, 4, "未检测到温湿度传感器", 16);
    }
    OLED_Show_Str(0, 4, "                      ", 16);
    OLED_Show_Str(20, 3, "温度:     ℃ 湿度:     %RH", 16);
    OLED_Show_Str(20, 6, "fire:    rain:          ", 16);
    
    while (1) {
        // 1. 读取温湿度数据
        DHT11_Read_Data(&temperature, &humidity); 
        fhumidity = Smoke_Test();
        // 2. 读取火灾传感器状态（假设低电平表示有火焰）
        int FIRF = gpio_get_pin(GPIO_PIN_37);
        FIRE = FIRF ? 0 : 1;  // 转换为逻辑值：1=有火焰，0=无火焰
        int smokef=gpio_get_pin(GPIO_PIN_36);
        smoke = smokef ? 0 : 1;
        if(FIRE||smoke==1)
        {
            BEEP_ON;
            delay_ms(10);
            BEEP_OFF;
            delay_ms(10);
            Fflag=1;
        }
        else{
            BEEP_OFF;
            Fflag=0;
        }
        if (fhumidity>=25)
        {
            BEEP_ON;
            delay_ms(10);
            BEEP_OFF;
            delay_ms(10);
            gpio_write_pin(GPIO_PIN_40,0);
        }
        else if (fhumidity<=15)
        {
            gpio_write_pin(GPIO_PIN_40,1);
        }
        
        
        // 3. 读取雨水传感器状态（ADC检测）
        value = Adc_Measure(ADC_CHANNEL_I6);
        rain = (value < 3000) ? 1 : 0;  // 假设电压<3000mV时表示有雨水
        
        // 4. 更新OLED显示
        sprintf(str, "%2d", temperature / 10);     
        OLED_Show_Str(70, 3, str, 16);           // 显示温度
        sprintf(str, "%2d", humidity / 10);
        OLED_Show_Str(110, 3, str, 16);          // 显示湿度
        OLED_Show_Str(70, 6, FIRE ? "1" : "0", 16);   // 显示火灾状态
        OLED_Show_Str(110, 6, rain ? "1" : "0", 16);   // 显示雨水状态
        
        data[0] = 0x04;
        data[1] = temperature / 256;
        data[2] = temperature % 256;
        data[3] = humidity / 256;
        data[4] = humidity % 256;
        data[5] = fhumidity / 256;
        data[6] = fhumidity % 256;
        data[7] = rain /256 ;
        data[8] = rain %256 ;
        data[9] = Fflag /256;
        data[10] = Fflag %256 ;
        
        delay_ms(444);
        DL_LN3X_Send(data, 11, ZIGBEE_RX_NODE);
    }

    return 0;
}